package com.ywk.base.java8.date;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * @author zbh
 * @date 2022/6/30 11:38
 */
public class CalendarTest {
    public static void main(String[] args) {

        System.out.println(Calendar.getInstance().get(Calendar.YEAR));
        // Date对象转换成Calendar对象
        Calendar cal = Calendar.getInstance();
        String millis="1678723200000";
        cal.setTimeInMillis(Long.valueOf(millis));


//        cal.setTime(new Date());
        System.out.println(new SimpleDateFormat("yyyyMM").format(cal.getTime()));
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(Long.valueOf(millis))));



        //Calendar对象转换成Date对象
        Calendar cal2 = Calendar.getInstance();
        Date d = cal2.getTime();

        // 获取日历对象
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        // 获取日期字段值
        System.out.println(calendar.get(Calendar.ERA));// 纪元，公元前还是公元
        System.out.println(calendar.get(Calendar.YEAR));// 年份
        System.out.println(calendar.get(Calendar.MONTH)+1);// 月份，需要加1，因为0表示1月，1表示2月，以此类推
        System.out.println(calendar.get(Calendar.HOUR));// 小时（12小时制）
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY));// 一天中第几个小时（24小时制）
        System.out.println(calendar.get(Calendar.MINUTE));// 分钟
        System.out.println(calendar.get(Calendar.SECOND));// 秒
        System.out.println(calendar.get(Calendar.MILLISECOND));// 毫秒
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));// 一年中第几天
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));// 一月中第几天
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 一周中第几天，注意，周日是1，周一是2，...
        System.out.println(calendar.get(Calendar.DATE));// 一月中第几天，同DAY_OF_MONTH的值是一样的
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));// 当月内一周中的某天的序号
        System.out.println("Calendar.WEEK_OF_YEAR=" + calendar.get(Calendar.WEEK_OF_YEAR));// 一年中的星期数，即本年中第几个星期
        System.out.println("Calendar.WEEK_OF_MONTH=" + calendar.get(Calendar.WEEK_OF_MONTH));// 当前月中的星期数，即本月中第几个星期
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));// 当前月中的第几个星期
        System.out.println("Calendar.AM_PM=" + calendar.get(Calendar.AM_PM));// AM_PM是在中午之前还是在中午之后,在中午12点之前返回0，在中午12点(包括12点)之后返回1
        System.out.println(Calendar.JANUARY);// 1月
        System.out.println(Calendar.FEBRUARY);// 2月
        System.out.println(Calendar.MARCH);// 3月
        System.out.println(Calendar.APRIL);// 4月
        System.out.println(Calendar.MAY);// 5月
        System.out.println(Calendar.JUNE);// 6月
        System.out.println(Calendar.JULY);// 7月
        System.out.println(Calendar.AUGUST);// 8月
        System.out.println(Calendar.SEPTEMBER);// 9月
        System.out.println(Calendar.OCTOBER);// 10月
        System.out.println(Calendar.NOVEMBER);// 11月
        System.out.println(Calendar.DECEMBER);// 12月

        // 设置日期字段值
        calendar.set(2021, Calendar.JUNE, 3);// 设定指定年月日，其中Calendar.JUNE为5实际上是六月，所以0表示1月，1表示2月，以此类推
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
        calendar.set(2021, Calendar.FEBRUARY, 3, 23, 55);// 设置年月日时分
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
        calendar.set(2021, Calendar.MARCH, 3, 23, 55, 30);// 设置年月日时分秒
        calendar.set(Calendar.YEAR, 2005);// 单独设置日历字段，设置年份
        calendar.set(Calendar.MONTH, 7);// 单独设置日历字段，设置月份，注意0代表1月
        calendar.set(Calendar.DATE, 11);// 单独设置日历字段，设置天数
        calendar.set(Calendar.HOUR_OF_DAY, 22);// 单独设置日历字段，设置小时
        calendar.set(Calendar.MINUTE, 45);// 单独设置日历字段，设置分钟
        calendar.set(Calendar.SECOND, 30);// 单独设置日历字段，设置秒
        calendar.set(Calendar.MILLISECOND, 235);// 单独设置日历字段，设置毫秒
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));

        // 计算日期字段值，既可以为正数，又可以为负数
        calendar.add(Calendar.YEAR, 2);// 在当前日期的基础上添加年份，后年
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
        calendar.add(Calendar.YEAR, -1);// 在当前日期的基础上减去年份，昨年
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
        calendar.add(Calendar.MONTH, 1);// 添加月份，下个月
        calendar.add(Calendar.MONTH, -1);// 添加月份，上个月
        calendar.add(Calendar.DATE, 2);// 添加天数，后天
        calendar.add(Calendar.DATE, -1);// 添加天数，昨天
        calendar.add(Calendar.HOUR_OF_DAY, 1);// 添加小时，下一个小时
        calendar.add(Calendar.HOUR_OF_DAY, -1);// 添加小时，上一个小时
        calendar.add(Calendar.MINUTE, 20);// 添加分钟，下20分钟
        calendar.add(Calendar.MINUTE, -20);// 添加分钟，上20分钟
        calendar.add(Calendar.SECOND, 30);// 添加秒数，下30秒
        calendar.add(Calendar.SECOND, -30);// 添加秒数，上30秒
        calendar.add(Calendar.DATE, 7);// 添加周数，即添加7天，下一周
        calendar.add(Calendar.DATE, -7);// 添加周数，上一周
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));

        // Calendar对象与Date对象的相互转换
        // Date对象转换成Calendar对象
        Calendar c2 = Calendar.getInstance();
        c2.setTime(new Date());
        // Calendar对象转换成Date对象
        Date c2Date = c2.getTime();// 类似于new Date()

        // 其他方法，如after、before
        Calendar c3 = Calendar.getInstance();
        c3.set(Calendar.YEAR, 2005);
        Calendar c4 = Calendar.getInstance();
        boolean after = c4.after(c3);// 判断c4的日期是否在c3之后
        System.out.println(after);
        boolean before = c3.before(c4);
        System.out.println(before);// 判断c3的日期是否在c4之前
        boolean equals = c3.equals(c4);// 判断c3的日期是否等于c4
        System.out.println(equals);
        int result = c3.compareTo(c4);// 如果比较c3和c4，如果c3<c4则返回-1，如果c3==c4则返回0，c3>c4则返回1
        System.out.println(result);

        Calendar c5 = Calendar.getInstance();
        c5.clear();
        c5.set(Calendar.YEAR, 2017);
        c5.set(Calendar.MONTH, 1);
        c5.set(Calendar.DAY_OF_MONTH, 30);
        System.out.println(c5.getTime());
        int lastDay = c5.getActualMaximum(Calendar.DAY_OF_MONTH);// 获取本月最后一天的号数
        int firstDay = c5.getActualMinimum(Calendar.DAY_OF_MONTH);// 获取本月第一天的号数
        System.out.println("本月最后一天：" + lastDay + ", 本月第一天：" + firstDay);

        // 获取毫秒数
        long timeInMillis = calendar.getTimeInMillis();// 返回此Calendar的时间值，以毫秒为单位
        int firstDayOfWeek = calendar.getFirstDayOfWeek();// 获取一个星期中的第一天
        System.out.println(firstDayOfWeek);
        TimeZone timeZone = calendar.getTimeZone();// 获取时区
        System.out.println(timeZone.getDisplayName());


    }
}
